/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package serialization;

import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 *
 * @author sdecrem
 */

public class GrapheT implements Serializable {
     /**
      * Création de l'instance au niveau de la variable.
      */
     transient private static GrapheT instance = null ; //new Graphe(); // BLOQUE LA SERIALIZATION
     /**
      * Conteneur de chemin
      */
     private static String[] listeChemin = new String[4] ; // PAS STATIC
     /**
      * Conteneur de ville
      */
     private static String[] listeVille = new String[4] ; // PAS STATIC
     /**
      * Conteneur de riviere
      */
     private static String[] listeRiviere = new String[1] ; // PAS STATIC
     /**
      * Conteneur de lac
      */
     private static String[] listeLac = new String[1] ; // PAS STATIC

     /**
      * La présence d'un constructeur privé supprime
      * le constructeur public par défaut.
      */
     private GrapheT() {} // BLOQUE LA SERIALIZATION
     
     /**
      * Retourne l'instance du singleton.
      */
     public static GrapheT getInstance() {
        if (null == instance) { // Premier appel
            instance = new GrapheT();
        }
        return instance;
     }

     public final static void setInstance(GrapheT g) {
         instance = g ;
     }

     public Object readResolve() throws ObjectStreamException {
         return instance ;
     }

     /**
      * Demande à l'utilisateur son choix pour la map à afficher
      * @return
      * le nom du fichier qui doit être placé dans un répertoire précis
      */
     private final static String mapChoice() {
         // TODO : demander la map avec un choix par defaut
         return null ;
     }

     /**
      * Parsage du fichier xml pour vérifier que les informations contenues sont valides.
      * @param filename
      * Le fichier qui sera parsé.
      * @return
      * Un boolean qui sera True si la map est valide et False dans le cas contraire.
      */
     private final static boolean checkIntegrityMap(String filename) {
         // TODO : parsage du fichier pour vérifier qu'il y a :
         // les 20 villes (dont une capitale) / les sommets / les lacs / les rivières
         return false ;
     }

     private static void write(Object o, String filename) throws Exception{
        XMLEncoder encoder =
            new XMLEncoder(
                new BufferedOutputStream(
                    new FileOutputStream(filename)));
        encoder.writeObject(o);
        encoder.close();
    } // utilisable dans l'éditeur de map 

    /**
     * Fonction qui se charge de la récupération des information, et la création des objets correspondant
     * @param filename
     * @return
     * NOT DEFINED (TODO)
     * @throws Exception
     */
    private final static Object read(String filename) throws Exception {
        XMLDecoder decoder =
            new XMLDecoder(new BufferedInputStream(
                new FileInputStream(filename)));
        Object o = (Object)decoder.readObject();
        decoder.close();
        return o;
    } // TODO : changement de Object par le bon type

    /* DEROULEMENT */
     // definir si on utilise une carte par defaut ou non       mapChoice() ;
     // parsage de l'intégrité de la map (si pas logique passer au choix par défaut en prévenant l'user) checkIntegrityMap(String filename) ;
     // si la carte est "intègre" chargement de la carte par    this.read("fichier.xml") ;
     // le chargement restorera :
     //                             - les 20 villes (dont une capitale)
     //                             - les chemins
     //                             - les lacs
     //                             - les rivières

    /*
     *  Setters et Getters necessaires pour la serialization
     *  obligatoirement en public
     */

    public void setChemin(int n, String s) {
        listeChemin[n] = s ;
    }

    public void setListeChemin(String[] l) {
        int n = 0 ;
        for (String chemin : l) {
            setChemin(n++, chemin) ;
        }
    }


    public String[] getListeChemin() {
        return listeChemin ;
    }

    public void setVille(int n, String s) {
        listeVille[n] = s ;
    }

    public void setListeVille(String[] l) {
        int n = 0 ;
        for (String ville : l) {
            setVille(n++, ville) ;
        }
    }

    public String[] getListeVille() {
        return listeVille ;
    }

    public void setRiviere(int n, String s) {
        listeRiviere[n] = s ;
    }

    public void setListeRiviere(String[] l) {
        int n = 0 ;
        for (String riviere : l) {
            setRiviere(n++, riviere) ;
        }
    }

    public String[] getListeRiviere() {
        return listeRiviere ;
    }

    public void setLac(int n, String s) {
        listeLac[n] = s ;
    }

    public void setListeLac(String[] l) {
        int n = 0 ;
        for (String lac : l) {
            setLac(n++, lac) ;
        }
    }

    public String[] getListeLac() {
        return listeLac ;
    }

    public static String affiche() {
        StringBuffer affichage = new StringBuffer() ;
        affichage.append(listeChemin[0]) ;
        affichage.append(listeChemin[1]) ;
        affichage.append(listeChemin[2]) ;
        affichage.append(listeChemin[3]) ;
        affichage.append("\n") ;
        affichage.append(listeVille[0]) ;
        affichage.append(listeVille[1]) ;
        affichage.append(listeVille[2]) ;
        affichage.append(listeVille[3]) ;
        affichage.append("\n") ;
        affichage.append(listeRiviere[0]) ;
        affichage.append("\n") ;
        affichage.append(listeLac[0]) ;
        affichage.append("\n") ;

        return affichage.toString() ;
    }

}
